package juego;
import java.util.ArrayList;
import java.util.Iterator;

public abstract class Vehiculo extends Automata {
	
	//Atributos de instancia
	protected boolean esGuia;
	protected boolean huyendo;
	protected Energia resistencia;
	
	
	//Metodos
	
	//Constructor. recibe una coordenada y un entero
	public Vehiculo(Coordenada coordenada, int vida){
		super(coordenada);
		this.esGuia = false;
		this.huyendo = false;
		this.resistencia = new Energia(vida);
	};
	
	//Transforma al vehiculo en guia
	public void designarGuia(){
		esGuia = true;
	};
	
	public void emprenderHuida(){
		huyendo = true;
	};
	
	@Override
	public boolean esNaveEnemiga(){
		return true;
	};
	
	@Override
	public boolean esProyectil(){
		return false;
	};
	
	protected abstract int puntajePorDestruccion();
	
	protected abstract int velocidad();
	
	//Mueve el vehiculo hacia arriba
	protected void huir(){
		ubicacion.moverEnY(-this.velocidad());
	};
	
	//Le indica a todas las naves que deben huir
	protected void provocarHuida(ArrayList<Movil> listaDeObjetos){
		
		Iterator<Movil> iterador = listaDeObjetos.iterator();
		while (iterador.hasNext()){
			Movil movil = iterador.next();
			if (movil.esNaveEnemiga()){
				
				//lo casteo
				Vehiculo nave = (Vehiculo) movil;
				nave.emprenderHuida();
			};
		};
	};
	
	@Override
	//se elimina de la lista si corresponde. devuelve el puntaje
	public int recibirImpacto(Impacto impacto, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		impacto.herir(this.resistencia);
		int puntaje = this.verificarDestruccion(listaDeMoviles, listaDeBotines);
		return puntaje;
	}
		
		
	//Lo primero que hace el vehiculo es moverse. Luego verifica si fue impactado,
	//y actua en consecuencia.	
	@Override
	public int vivir(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		int puntaje = 0;
		//movimiento
		if (this.huyendo){
			this.huir();
		}
		else{
			this.movimientoPropio();
		};
		//impacto
		puntaje = this.impactar(listaDeMoviles,listaDeBotines);
		return puntaje;
	};
	
	
//	//Retorna el puntaje acumulado por la destruccion de otros moviles.
//	//Este metodo se encarga de llamar al metodo destruirse.
//	@Override
//	protected int impactar(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
//		Queue<Movil> cola = this.acolarMoviles(listaDeMoviles);
//		int puntaje = this.vivirMovilesAcolados(cola, listaDeMoviles, listaDeBotines);
//		return puntaje;
//	}
		
		
		
		

	
	
//	//impacta contra los otros moviles si corresponde.
//	//recibe Queue<Movil> cola
//	//devuelve el puntaje acumulado
//	protected int vivirMovilesAcolados(Queue<Movil> cola, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
//		int puntajeAcumulado = 0;
//		boolean seguir = true;
//		Movil movil;
//		while (seguir){
//			try{
//				movil = cola.remove();
//				if (movil.estaVivo()){
//					try{
//						if (movil.huboContacto(this)){
//							//solo puede ser impactado por el algo42 o proyectiles de este
//							if (movil.verLealtad()){
//								//movil hiere a this
//								movil.impactoProvocado().herir(this.resistencia);
//								//movil recibe el impacto. se elimina de la lista si corresponde
//								movil.recibirImpacto(this.impactoProvocado(), listaDeMoviles, listaDeBotines);
//								//nada con lo que pueda impactar modificara el puntaje
//							}
//						}
//					}
//					//si se compara con si mismo
//					catch (ExcepcionMismoElemento eme){}
//				}
//			}
//			//si la cola esta vacia
//			catch (Exception colaVacia){
//				seguir = false;
//			}
//		}//sale del ciclo
//		
//		if (!this.resistencia.quedaEnergia()){
//			this.destruirse(listaDeMoviles);
//			puntajeAcumulado += this.puntajePorDestruccion();
//			if (this.esGuia){
//				this.provocarHuida(listaDeMoviles);
//			}
//		}
//		
//		return puntajeAcumulado;
//	}
	
	//retorna 0. resuelve el choque
	protected int impactoPropio(Movil movil, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		//solo puede ser impactado por el algo42 o proyectiles de este
		if (movil.verLealtad()){
			//movil hiere a this
			movil.impactoProvocado().herir(this.resistencia);
			//movil recibe el impacto. se elimina de la lista si corresponde
			movil.recibirImpacto(this.impactoProvocado(), listaDeMoviles, listaDeBotines);
			//nada con lo que pueda impactar modificara el puntaje
		}
		return 0;
	}
	
	//se encarga de destruirse si corresponde. devuelve el puntaje
	protected int verificarDestruccion(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		//si queda energia no se destruye y retorna 0
		if(this.resistencia.quedaEnergia()){
			return 0;
		}
		//si se destruye retorna el puntaje x destruccion
		this.destruirse(listaDeMoviles);
		if (this.esGuia){
			this.provocarHuida(listaDeMoviles);
		}
		return this.puntajePorDestruccion();
	}
			
		
	
		
	
		
	
	

}



